package com.ctshk.rpc.order.goods.service;

import com.ctshk.common.dto.Result;
import com.ctshk.common.dto.payment.CallPayDTO;
import com.ctshk.common.model.PageResponse;
import com.ctshk.common.model.TokenUser;
import com.ctshk.common.req.pay.NotifyConsumeReq;
import com.ctshk.rpc.order.goods.dto.*;
import com.ctshk.rpc.order.goods.req.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 订单表 服务类
 * </p>
 *
 * @author 姜斌文
 * @since 2021-04-19
 */
public interface IOrderService {

    /**
     * 驳回收款
     * @param collectionNumber 收款单号
     * @return
     */
    Result rejectPayment(String collectionNumber, Long userId, String msg);

    /**
     * 新增商品
     * @param addReq 订单入参对象
     * @param tokenUser 用户
     * @throws Exception 異常
     */
    Long addOrder(OrderAddReq addReq,  TokenUser tokenUser) throws Exception;


    /**
     * 訂單支付
     * @param oderId 訂單ID
     * @param orderCommodityCollectionReqList 支付明細列表
     * @param userId 用戶ID
     */
    void payment(Long oderId, List<OrderCommodityCollectionReq> orderCommodityCollectionReqList, Long userId);

    /**
     * 订单支付--支付回调
     * @param notifyConsumeReq
     * @return
     * @throws Exception
     */
    Result payment(NotifyConsumeReq notifyConsumeReq) throws Exception;

    /**
     * 取消訂單
     * @param refundReqs
     * @param tokenUser
     */
    void cancelOrder(OrderCommodityRefundReq2 refundReqs, TokenUser tokenUser);

    /**
     * 取消訂單
     * @param refundReqs
     * @param tokenUser
     */
    void cancelAppOrder(List<OrderCommodityRefundReq> refundReqs, TokenUser tokenUser);

    /**
     * 備注訂單
     * @param addReq 入參
     * @param userId 用戶ID
     */
    void remarkOrder(OrderAddReq addReq, Long userId);


    /**
     * 商品訂單分頁列表
     * @param req 分頁查詢入參
     * @param userId 用戶ID
     * @return 集合
     */
    PageResponse<OrderPageListDTO> orderPageList(OrderPageListReq req, TokenUser tokenUser);

    /**
     * 根据订单ID获取订单（发货）明细详情
     * @param orderId 订单ID
     * @param type 0-查看订单明细，1-查看发送物流订单明细
     * @param tokenUser 用户对象
     * @return 订单明细
     */
    OrderDetailDTO getOrderDetailed(Long orderId, Integer type, TokenUser tokenUser);

    /**
     * 修改收货人信息
     * @param orderConsigneeInfoReq 收货人信息入参
     * @param tokenUser 用户对象
     */
    void updateOrderConsigneeInfo(OrderConsigneeInfoReq orderConsigneeInfoReq, TokenUser tokenUser);

    /**
     * 订单发货
     * @param req 商品发货入参
     * @param tokenUser 用户对象
     */
    void upOrderCommodityDeliverGoods(OrderCommodityDeliverGoodsReq req, TokenUser tokenUser);

    /**
     * 订单取消审批-状态更新
     * @param orderCancelApprovalProcessReq 订单取消审批流程参数
     * @param tokenUser 用户对象
     */
    void cancelOrderApprovalProcess(OrderCancelApprovalProcessReq orderCancelApprovalProcessReq, TokenUser tokenUser);

    /**
     * 删除退款记录-只能删除已经拒绝的退款记录
     * @param id 退款表主键ID
     * @param tokenUser 用户对象
     */
    void deleteApprovalRejected(Long id, TokenUser tokenUser);

    /**
     * 操作退款-确认退款更新状态
     * @param id 退款表主键ID
     * @param tokenUser 用户对象
     * @return
     */
    Result updateRefundStatus(Long id, TokenUser tokenUser);

    /**
     * 查询所有商品销量统计
     */
    List<OrderCommodityPageListDetailDTO> salesVolume();

    /**
     * 中旅到家Pc新增订单
     * @param obj
     * @param userId
     * @return
     */
    Result<Long> addAppOrder(OrderAddReq obj,Long userId) throws Exception;

    /**
     * C端平台支付
     * @param oderId
     * @param shopId
     */
    Result payPlatform(Long oderId,Integer code,Long shopId);

    /**
     * 最近一次查询结束时间到当前时间的数据
     * @return
     */
    Result<List<MyOrderDetailDTO>> recentToNow(LocalDateTime recent, LocalDateTime now);

    /**
     * 预订中心-商品订单-支付订单
     *
     * @param req
     * @param tokenUser
     * @return 返回值
     */
    Result payOrder(OrderCommodityPayReq req, TokenUser tokenUser);

    /**
     * C端-商品订单-支付订单
     *
     * @param req
     * @param payMethod
     * @return 返回值
     */
    Result payAppOrder(OrderCommodityPayReq req,String payMethod);


    /**
     * 付款成功，进行支付
     * @param req
     * @param tokenUser
     * @return
     */
    Result payCallback(NotifyConsumeReq req,TokenUser tokenUser) throws Exception;

    /**
     * 商品訂單分頁列表
     * @param req 分頁查詢入參
     * @param userId 用戶ID
     * @return 集合
     */
    PageResponse<OrderPageListDTO> orderCommodityPage(OrderPageListReq req, Long userId);

    /**
     * PC-根据订单ID获取订单详情
     * @param orderId 订单ID
     * @param type 0-查看订单明细，1-查看发送物流订单明细
     * @param tokenUser 用户对象
     * @return 订单明细
     */
    OrderDetailDTO getOrderCommodityDetail(Long orderId, Integer type, TokenUser tokenUser);

    /**
     * C端-根据订单编号和查询号码查询订单
     * @param orderNumber 订单号码
     * @param searchCode 查询号码
     * @return 订单信息
     */
    Result<OrderDetailDTO> queryOrderByOrderNumAndSearchCode(String orderNumber, String searchCode);

    /**
     * 根据订单id获取订单详情
     * @param id
     * @return
     */
    Result<OrderDTO> info(Long id);


    /**
     * 回调支付
     * @param id
     * @return
     */
    CallPayDTO getCallPayInfo(Long id);

    /**
     * 查询挂账额度
     * @param req
     * @return
     */
    Result<QueryQuotaDTO> queryQuota(QueryQuotaReq req);

    /**
     * 查询APP订单详情
     * @param orderId
     * @param type
     * @param currentUser
     * @return
     */
    OrderDetailDTO getAppOrderCommodityDetail(Long orderId, Integer type, TokenUser currentUser);

}
